import pandas as pd
import os
from openpyxl import load_workbook
from flask import Flask, request, jsonify, send_file
import re
import json
import tempfile

class ExcelProcessor:
    def __init__(self, model_service=None):
        self.model_service = model_service
        
    def _generate_prompt(self, row_content):
        """
        根据行内容生成prompt
        规律总结：
        1. 每个prompt都以##角色作为开始
        2. 包含任务、关键信息定义、要求和输出要求部分
        3. 通常包含具体检查项列表
        4. 包含输出示例
        """
        category = row_content.get('审查检查类别', '')
        item = row_content.get('审查检查项', '')
        
        if not category or not item:
            return "无法生成prompt，缺少必要信息"
        
        # 构建基本prompt结构
        prompt = f"""##角色:你是一名软件技术方案与详细设计审核专家。
##任务：
根据待审核内容与具体检查项进行审核并给出审核结论。

##关键信息定义:
1、{category}相关内容：{item[:50]}...

##要求:
检查结论要求:先给出整体结果为通过还是不通过，再逐一列出不符合检查项要求的项目，并逐一给出修改意见。
检查项如下:
1、仅审核"{category}"章节
2、{item}
若不涉及{category}相关内容则结论为不涉及。

##输出要求：
结论：当检查项均不存在输出不涉及，检查项存在且满足检查项要求时，输出通过，否则不通过
原因：输出不满足的事项及原文描述。格式一般为原文提及"xxx",但xxxxx，违反了【xxx】。满足或不涉及时，原因写无。

##输出示例1:
结论：不通过
原因:原文中未明确说明{category}相关的{item[:30]}...具体影响，建议补充说明。
##输出示例2:
结论:通过。
原因:无"""
        
        # 如果有模型服务，可以调用获取更精确的prompt
        if self.model_service:
            try:
                context = {
                    "category": category,
                    "item": item
                }
                prompt = self.model_service.generate_prompt(context)
            except Exception as e:
                print(f"模型生成prompt失败: {str(e)}")
                # 失败时使用基本prompt
                pass
                
        return prompt
    
    def process_excel(self, input_file_path):
        """
        处理Excel文件，为每行生成prompt
        """
        try:
            # 使用pandas读取Excel文件的"设计审查指引"工作表
            df = pd.read_excel(input_file_path, sheet_name="设计审查指引")
            
            # 检查是否已经有prompt列，如果有则不重复添加
            if 'prompt' not in df.columns:
                # 准备添加prompt列的内容
                prompts = []
                
                # 逐行处理并生成prompt
                for index, row in df.iterrows():
                    row_content = row.to_dict()
                    prompt = self._generate_prompt(row_content)
                    prompts.append(prompt)
                
                # 添加新列
                df['prompt'] = prompts
                
                # 使用openpyxl保留Excel格式
                book = load_workbook(input_file_path)
                sheet = book["设计审查指引"]
                
                # 添加prompt列标题
                prompt_col = len(sheet[1]) + 1
                sheet.cell(row=1, column=prompt_col, value="prompt")
                
                # 添加prompt内容
                for i, prompt in enumerate(prompts, start=2):  # 从第2行开始
                    sheet.cell(row=i, column=prompt_col, value=prompt)
                
                # 创建临时文件保存结果
                temp_dir = tempfile.mkdtemp()
                output_file_path = os.path.join(temp_dir, os.path.basename(input_file_path))
                book.save(output_file_path)
                
                return {
                    "success": True,
                    "message": f"成功为{len(prompts)}行生成prompt",
                    "file_path": output_file_path
                }
            else:
                return {
                    "success": False, 
                    "message": "Excel文件已经包含prompt列"
                }
                
        except Exception as e:
            return {
                "success": False, 
                "message": f"处理Excel文件失败: {str(e)}"
            }

# 简单测试
if __name__ == "__main__":
    processor = ExcelProcessor()
    # 假设Excel文件在当前目录
    input_file = "设计评审的要点模板.xlsx"
    if os.path.exists(input_file):
        result = processor.process_excel(input_file)
        print(result)
    else:
        print(f"文件不存在: {input_file}")
